Vezérlés az LPT-porton Alfától Omegáig. II. | ||||
|
Cikkünk előző részében összefoglaltuk a fontosabb portokat, illetve részletesen megismerkedtünk a nyomtató kapujával. Tudjuk, hogy miként kell beállítani a BIOS-t, mekkora áramerősséggel lehet terhelni az egyes kimeneteket, melyik tüske mire használható, valamint milyen portcímekre író, vagy onnan olvasó utasításokkal tudunk kapcsolatot fenntartani a csatlakozóra kötött perifériáinkkal. Nem tudjuk azonban, hogy az egyes programnyelvekben ezt milyen módon tehetjük meg. Mint az előző részben megígértem, ebben a részben most erről olvasatunk. Ma igen sokféle nyelven programoznak az emberek. Mindegyik port-kezelését bemutatni nincs esély. Azonban a legfontosabbakat, amelyekből kisebb nagyobb ügyeskedéssel elérhető célunk, már meg tudjuk ismerni. Előbb azonban tegyünk kis kitérőt, legyen a portunkra egy aprócska hardver kapcsolva. Ez egy 270 ohmos ellenállással sorba kötött 5mm-es piros LED. Még csatlakozónk sincs, ezért az ellenállás szabad végét, illetve a LED másik kivezetését közvetlenül a portba dugjuk. (Nem szakszerű, (s nem árt megkímélni a gépünk csatlakozóját holmi vastag drótoktól,) de legalább olcsó, egyszerű és működik. Az alkatrészeket egy kidobott 5.25”-os floppy meghajtóból termeltem ki. Külön előny volt, hogy piros dróttal jelezték, melyik a pozitív kivezetése. Vigyázat!!! A LED polaritás-érzékeny, alkatrész. Mérjük ki műszerrel, vagy kérjük ki a kereskedő, esetleg szakember véleményét, hogy melyik az anódja, vagyis a pozitív kivezetése. Erre forrasszuk az ellenállást. FONTOS! Áramkorlátozó ellenállás nélkül a LED-et tilos áramforrásra kapcsolni, mert tönkremehet!
Ez egy gyakran használt, univerzális próbaalkatrész, amivel sok mindent tudunk ellenőrizni. Érdemes tehát mindenképp elkészíteni. (Ennél egyszerűbbet ha valaki tud, akkor- J) Dugjuk most az ellenállás szabad végét az adatport B0-bitjébe. Ha emlékszünk az előző rész táblázatára, akkor tudjuk, hogy ez éppen a kettes számmal jelzett kivezetés a 25-pólusú, D-alakú "mama" csatlakozón. A szabad vég, ami tehát a LED katódja, vagyis negatív kivezetése még kezünkben van. Ezt egy GND, vagyis testpontra kapcsoljuk. Ez lehet maga a gép házának valamely villamosan vezető pontja, de lehet pl. a 18-25-ös számú lyukak bármelyike. (Pl. én a 24-esbe dugtam, hogy a fotón jobban mutasson.) Az érintkezésre figyeljünk oda. A drótok ne feszüljenek túlzottan, de ne is lötyögjenek.(Kis műszaki érzékkel menni fog.) E kis kitérő után lássuk a medvét, kezdjük mindjárt a legegyszerűbb módszerrel! Perifériák kezelése DOS alattKi gondolta volna-? J Pedig a jó öreg operációs rendszerben erre is gondoltak! Van egy izgalmas külső parancs, ez pedig a DEBUG. Az a legszebb a dologban, hogy mindenféle programozási ismeret nélkül, egy átlagos felhasználó is írhat/olvashat a memóriába/portokra. Vagyis első, egyszerűbb hardvereinket játszva letesztelhetjük, mielőtt akárcsak egyetlen sornyi programot is megírnánk. Ehhez valóban nem kellenek csuda dolgok, fordítók, programnyelvek, stb. Lássuk, hogyan történik mindez: A DEBUG kurzora egy kötőjel. Számunkra szükséges parancskészlete pedig három betű mindössze, érdemes tehát nagyon elménkbe vésni: OIQ A Q paranccsal kiléphetünk a DOS-ba, Az I paranccsal adatot olvashatunk be, míg az O paranccsal adatot írhatunk ki a portra. Nézzük a kezelését. Tegyük fel, hogy a portunk báziscíme 378h (hexadecimális számrendszerben). A hardver a B0 bitre van kapcsolva. Mivel kettő nulladik hatványa 1, ezért ha 1-et írunk a portra, akkor - a többi bit kikapcsolt állapota mellett - itt logikai 1 szint jelenik meg, ami közel 5V feszültséget jelent. Erre pedig a kis teszt áramkörünk biztosan világítani fog. Ha ki akarjuk kapcsolni, egyszerűen nullát kell kiküldenünk. Lássuk ezt a DEBUG nyelvén: (DOS alatt, - vagy WIN9x alatt indított DOS ablakban - beírtuk: DEBUG. Ezzel kész is a használatra a külső parancs.) - O 378 FF - O 378 00 Vigyázva a szóközökre! Látható, ahogy a LED felgyullad, illetve kialszik. Ha esetleg nem működne, ellenőrizzük az érintkezést, a polaritást, valamint a port címét. (Csupán 3 variáció van, érdemes tehát végig próbálni. Csak emlékeztetőül: 378/3BC/278) Hasznos tudni még egy apróságot: Amikor a számítógépet bekapcsoljuk, az önteszt során a BIOS inicializálja a portot, illetve az esetek többségében kiküld egy tesztsorozatot is. A régi mátrixnyomtatók feje ezért mozdul meg ekkor, s természetesen ezt a rákapcsolt teszt LED-jeink határozottan érzékelhető felvillanása is mutatja. Jól jöhet esetleges hibakereséskor! J Beolvasni adatot így lehet a portunkról: - I 379 (Emlékezzünk vissza, a bemenő port: báziscím+1!). Érdemes megfigyelni, hogy a címeket, illetve adatokat hexadecimális számrendszerben kell megadni, s a program úgy is adja őket vissza. HEXA-DEC, meg bináris átváltási táblázattal nem kívánom a helyet pazarolni, ezt mindenkinek illik ismerni, aki számítógéppel, de főleg programozással foglalkozik. Ha véletlenül mégsem így lenne, akkor olvassunk gyorsan utána egy alapkönyvben. Szinte észrevétlenül, de már birtokba is vettük a portunkat! Tudunk adatokat kiírni, illetve beolvasni onnan, illetve elkészítettük az első, egybites alkalmazást is. Már csak azt kell megnéznünk, hogy a programjainkba hogyan tudjuk mindezt beépíteni. Mert igazán csak akkor lesz érdekes a dolog; BASIC-nyelvKezdjük a régi kedvencemmel, a BASIC-el. Azért szeretem, mert pillanatok alatt lehet tesztprogramot írni benne az interpreter jóvoltából, s nem kell fejléc, változó deklarálás, fordítgatás, stb. Itt az OUT utasítással lehet kiírni, az INP utasítással pedig beolvasni adatot. Nézzünk egy példát ezekre. (Minden sor egy funkció, a végén megjegyzéssel) 10 OUT &h378,1 15 REM Bekapcsoltuk a LED-et. Hexa alakban adtuk meg a címet! 20 OUT 888,0 25 REM Kikapcsoltuk a portot, de decimális alakban adtuk meg a címet. 30 A=INP(&h379) 35 REM Bemenő port állapota az A-változóba, hexa címmegadással. 40 B=INP(&h379) 45 REM beolvastuk a bemenő port állapotát decimális címmegadással B-be. 50 PRINT A,B A kiírt két érték azonos lesz. (Nálam 207 volt.) A szorgalmasabbak kiszámolhatják, hogy ez bináris értékre átváltva, illetve a - táblázatban is megadott - negált biteket is figyelembe véve, vajon milyen bitkombinációnak is felel meg? Természetesen ha programot ebben a formában lefuttatjuk, akkor a LED nagyon rövid ideig fog világítani, így nem árt késleltetni pl. a 25. Sorban egy üres ciklussal. Ezt azonban a fantáziájára bízom mindenkinek. ASSEMBLY-nyelvEz a legtermészetesebb nyelv, a processzor számára, tehát itt sincs sok bajunk a dologgal: mov dx,378h mov al,1 out dx,al Ez a fenti példában 10-es sor megfelelője. in al,379h Ez pedig a 30-as BASIC sor ASM verziója. Ugye, milyen egyszerű? J C-nyelvItt igazán sok lehetőségünk van. Pl. az ASM direktívával azonnal assembly kódot szúrhatunk be: asm out dx,al asm in al,379 Vagy ha sok ASM utasítás kell, akkor a direktíva mögé kapcsos zárójelben is felsorolhatjuk őket. (Lásd. a C HELP-jét, mert az implementációtól is függhet.) Vannak persze könyvtári függvények is a port-kezelésre. Pl.: <DOS.H> adat=inportb(portcim) ; outportb(portcim, adat); Van szavas átvitel, meg sok egyéb érdekesség is, de arra itt nemigen lesz szükségünk. Külön előny, hogy regiszternek változóérték is adható, tehát a C-programunk és az ASM között a határ elmosható: asm mov al,portadat PASCAL-nyelvItt is adott az .ASM direktíva, vagyis akárcsak a C-nél, ez szintén beválik. Van egyébként egy PORTW, meg egy másik PORT tömb, aminek segítségével egyszerűen, direkt írással is lehet kezelni a portokat. A tömb adott sorszámú eleme az adott című porthoz tartozik: PORTW[$0378]:=1 allapot:=PORT[$0379] Ezzel rögtönzött kis port-nyelvtanóránk végére is értünk. Az elkövetkezőkben egyszerűbb hardver kiegészítők készítését, illetve ezek programozását fogom bemutatni. Szépen haladunk majd a mind bonyolultabb szerkezetek felé. A példaprogramok zömmel BASIC-ben készülnek, illetve később talán C-- (nem tévedés, C mínusz mínusz J) nyelven, ASM betétekkel. Ennek főként a hely, illetve időhiány az oka, mert a legrövidebb terjedelmű kódokat így tudom leközölni. Azonban a fenti ismeretek, illetve a későbbi működési leírások birtokában mindenki átírhatja őket a saját maga által preferált nyelvre. Sokan irtóznak a hardverek programozásától, esetleg egyenesen a forrasztópákához való hozzáéréstől is. Azt hiszik, valami misztikus, vagy bonyolult, esetleg költséges dolog ez a technika. Most, hogy kezdjük egyben látni a dolgokat, döntse el az olvasó, vajon hol van ebben a misztikum, vagy a bonyolultság? S eddig mennyibe is került a játék? Ha ügyesek, találékonyak vagyunk, akkor a későbbiekben se fogjuk otthagyni az alkatrész-kereskedésben ingünk-gatyánk. J | ||||
Kis Norbert |